package com.briup.smartcity_group1.service.impl;

import com.briup.smartcity_group1.bean.basic.Carousel;
import com.briup.smartcity_group1.consts.CarouselDbConsts;
import com.briup.smartcity_group1.dao.basic.CarouselMapper;
import com.briup.smartcity_group1.dao.ext.CarouselExtMapper;
import com.briup.smartcity_group1.exception.ServiceException;
import com.briup.smartcity_group1.service.ICarouselService;
import com.briup.smartcity_group1.utils.result.ResultCode;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 轮播图服务层接口实现类
 * @author WangChen
 * @date 2023/1/4 10:23
 */
@Service
public class CarouselServiceImpl implements ICarouselService {

    @Autowired
    private CarouselMapper mapper;
    @Autowired
    private CarouselExtMapper extMapper;

    /**
     * 分页查询轮播图信息
     *
     * @param pageNum  页码
     * @param pageSize 单页的记录数
     *
     * @return 轮播图页面信息
     */
    @Override
    public PageInfo<Carousel> findAllByPage(int pageNum, int pageSize) {
        PageInfo<Carousel> pageInfo = PageHelper.startPage(pageNum, pageSize, true).doSelectPageInfo(
                () -> extMapper.selectAll()
        );
        return pageInfo;
    }

    /**
     * 根据 id 删除轮播图
     *<p>
     * 当轮播图状态为启用状态时，提示用户无法删除正在启用的轮播图。
     * 当轮播图总数为1张时，提示用户无法全部删除全部轮播图，最少有一张轮播图存在。
     *<p/>
     *
     * @param id 轮播图id
     *
     * @throws ServiceException 要删除的轮播图正在启用，只有一张轮播图，要删除的轮播图不存在
     */
    @Override
    public void deleteById(Integer id) {
        //判断是否只有一张轮播图
        if (CarouselDbConsts.LIMIT_MIN == extMapper.count() ){
            throw new ServiceException(ResultCode.CAROUSEL_DELETE_LIMIT_MIN);
        }

        //判断轮播图是否被启用
        Carousel carousel = mapper.selectByPrimaryKey(id);

        if (CarouselDbConsts.ENABLED == carousel.getCarouselStatus() ){
            throw new ServiceException(ResultCode.CAROUSEL_DELETE_LIMIT_ENABLED);
        }


        mapper.deleteByPrimaryKey(id);
    }

    /**
     * 保存轮播图信息
     * <p>
     * 新增轮播图默认状态为禁用状态
     * 不能添加重复的轮播图地址
     * <p/>
     *
     * @param carousel 要保存的轮播图
     * @throws ServiceException 轮播图地址重复
     */
    @Override
    public void saveCarousel(Carousel carousel) throws ServiceException{

        carousel.setCarouselStatus(CarouselDbConsts.DISABLED);

        //获取所有轮播图地址的列表
        List<String> urls = extMapper.selectAllUrl();

        //判断轮播图地址是否重复
        if (urls.contains(carousel.getCarouselUrl())){
            throw new ServiceException(ResultCode.CAROUSEL_DUPLICATE_URL);
        }

        mapper.insert(carousel);
    }

    /**
     * 更新轮播图信息
     * <p>
     * 1.当用户点击修改轮播图，可以根据轮播图id修改轮播图名称 地址 和描述信息
     * 2.当用户修改轮播图状态时，只提供轮播图id和轮播图状态信息
     * 3.系统中保证最小有一个轮播图处于开启状态
     * 4.除 id 外，其他属性都可为 null
     * </p>
     *
     * @param carousel 更新轮播图信息
     */
    @Override
    public void updateCarousel(Carousel carousel) {

        Carousel oldCarousel = mapper.selectByPrimaryKey(carousel.getCarouselId());

        //Added
        // 防止更新时轮播图地址信息重复(新信息和旧信息的图片地址可以重复,即无修改)
        if (!oldCarousel.getCarouselUrl().equals(carousel.getCarouselUrl())){
            //获取所有轮播图地址的列表
            List<String> urls = extMapper.selectAllUrl();
            //判断轮播图地址是否重复
            if (urls.contains(carousel.getCarouselUrl()) &&
                    oldCarousel.getCarouselUrl().equals(carousel.getCarouselUrl())){
                throw new ServiceException(ResultCode.CAROUSEL_DUPLICATE_URL);
            }
        }

        //是否抛出提示"强制开启当前轮播图"的异常?抛出后无法的到正常返回值,决定不抛出

        //其他轮播图都未启用,或在更新前只有当前轮播图启用时,自动启用当前轮播图
        if (CarouselDbConsts.NO_RECORD == extMapper.countByYes()
                || (CarouselDbConsts.LIMIT_MIN ==  extMapper.countByYes()
                    && CarouselDbConsts.ENABLED == oldCarousel.getCarouselStatus())){

            carousel.setCarouselStatus(CarouselDbConsts.ENABLED);
        }

        mapper.updateByPrimaryKeySelective(carousel);

    }

    /**
     * 查询所有已经启用的轮播图
     *
     * @return 所有已经启用的轮播图
     */
    @Override
    public List<Carousel> findYesCarousel() {
        return extMapper.selectByYes();
    }
}
